/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Control;

import DAO.EspacoDAO;
import DAO.EspacoRecursoDAO;
import DAO.RecursoDAO;
import Model.Espaco;
import Model.Recurso;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;

/**
 *
 * @author 0433101
 */
public class atualizarEspaco extends Processor {

    @Override
    public void execute() throws ServletException, IOException {
        getResponse().setContentType("text/html;charset=UTF-8");
        try{
            //Editar espaco
            String id = getRequest().getParameter("id");
            String n = getRequest().getParameter("num");
            String end = getRequest().getParameter("end");
            String cap = getRequest().getParameter("cap");
            String descricao = getRequest().getParameter("descricao");
            String tipo = getRequest().getParameter("tipoEspaco");
            
            if(n == null || end == null || cap == null || descricao == null || tipo == null){
                throw new NullPointerException();
            }
            
            if(n.equals("") || end.equals("") || cap.equals("") || tipo.equals("")){
                String erro = "Campos devem ser preenchidos!";
                getRequest().setAttribute("erro", erro);
                RequestDispatcher rd = getRequest().getRequestDispatcher("alterarEspaco.jsp");
                rd.forward(getRequest(), getResponse());
            }
            
            int num = Integer.parseInt(n);
            int capacidade = Integer.parseInt(cap);
            int tipoEspaco = Integer.parseInt(tipo);
            int id_espaco = Integer.parseInt(id);
            int id_endereco = Integer.parseInt(end);
            
            if(num < 0 || capacidade < 0 || id_endereco < 0){
                String erro = "Números devem ser positivos!";
                getRequest().setAttribute("erro", erro);
                RequestDispatcher rd = getRequest().getRequestDispatcher("alterarEspaco.jsp");
                rd.forward(getRequest(), getResponse());
            }
            
            //Editar Espaco
            boolean valido = EspacoDAO.editar(id_espaco, id_endereco, capacidade, tipoEspaco, descricao, num);
            if(!valido){                
                String erro = "Parâmetros inválidos ou número de espaço já existe!";
                getRequest().setAttribute("erro", erro);
                RequestDispatcher rd = getRequest().getRequestDispatcher("atualizarEspaco.jsp");
                rd.forward(getRequest(), getResponse());
            }
            Espaco espaco = EspacoDAO.PesquisarById(id_espaco);
            boolean naoErro = true;
            //incluir equipamentos em espaco  CONTINUAR
            String[] r = getRequest().getParameterValues("recurso");
            if(r == null){
                String mensagem = "Espaço cadastrado com sucesso!";
                getRequest().setAttribute("mensagem", mensagem);
                RequestDispatcher rd = getRequest().getRequestDispatcher("menuAdministrador.jsp");
                rd.forward(getRequest(), getResponse());
            }
            else if(r!=null){
                for(int i = 0 ; i < r.length ; i++){
                    String atual = r[i];
                    Recurso recurso = RecursoDAO.pesquisarByNome(atual);
                    ArrayList<Recurso> er = EspacoRecursoDAO.recursosEspaco(id_espaco);
                    int index = er.indexOf(recurso);
                    if(recurso.getQuantidade_disponivel() != -1){
                        String q = getRequest().getParameter("quantidade_" + recurso.getNome_recurso());
                        String qd = getRequest().getParameter("quantidadeD_" + recurso.getNome_recurso());
                        //out.println("quantidade_" + recurso.getId_recurso() + " = " + q + " quantidade<br>");
                        int quantidade = 0;
                        int quantidadeD = 0;
                        int qAtual = 0;

                        if(er.contains(recurso)){
                            qAtual = er.get(index).getQuantidade_disponivel();
                        }
                        if(!q.equals("")){
                            quantidade = Integer.parseInt(q);
                        }
                        if(!qd.equals("")){
                            quantidadeD = Integer.parseInt(qd);
                        }
                        if(quantidade < 0 || quantidadeD < 0){
                            String erro = "Números devem ser positivos!";
                            getRequest().setAttribute("erro", erro);
                            RequestDispatcher rd = getRequest().getRequestDispatcher("alterarEspaco.jsp");
                            rd.forward(getRequest(), getResponse());                        
                        }
                        if(qAtual + quantidade - quantidadeD < 0){
                            String erro = "Recurso não pode ter quantidade negativa!";
                            getRequest().setAttribute("erro", erro);
                            RequestDispatcher rd = getRequest().getRequestDispatcher("alterarEspaco.jsp");
                            rd.forward(getRequest(), getResponse()); 
                        }
                        //incluir em sala recurso, diminuir de recurso
                        boolean autorizado = false;
                        if(quantidade - quantidadeD > 0){
                            autorizado = RecursoDAO.diminuirRecurso(recurso.getId_recurso(), quantidade - quantidadeD);
                        }
                        else if(quantidade - quantidadeD < 0){
                            autorizado = RecursoDAO.acrescentarRecurso(recurso.getId_recurso(), quantidadeD - quantidade);
                        }
                        if(autorizado){
                            naoErro = true;
                            if(er.contains(recurso)){
                                naoErro = EspacoRecursoDAO.update(espaco.getId_espaco(), recurso.getId_recurso(), qAtual + quantidade - quantidadeD);
                            }
                            else{
                                naoErro = EspacoRecursoDAO.inserir(espaco.getId_espaco(), recurso.getId_recurso(), qAtual + quantidade - quantidadeD);
                            }
                            if(!naoErro){
                                String mensagem = "Erro na operação!";
                                getRequest().setAttribute("mensagem", mensagem);
                                RequestDispatcher rd = getRequest().getRequestDispatcher("menuAdministrador.jsp");
                                rd.forward(getRequest(), getResponse()); 
                            }
                        }
                        else if(quantidade - quantidadeD != 0){
                            String erro = "Quantidade de recurso requerida não disponível!";
                            getRequest().setAttribute("erro", erro);
                            RequestDispatcher rd = getRequest().getRequestDispatcher("alterarEspaco.jsp");
                            rd.forward(getRequest(), getResponse()); 
                        }
                    }else{
                        if(!er.contains(recurso)){
                            EspacoRecursoDAO.inserir(espaco.getId_espaco(), recurso.getId_recurso(), -1);
                        }                    
                    }                
                }                

                if(naoErro){
                    String mensagem = "Espaço cadastrado com sucesso!";
                    getRequest().setAttribute("mensagem", mensagem);
                    RequestDispatcher rd = getRequest().getRequestDispatcher("menuAdministrador.jsp");
                    rd.forward(getRequest(), getResponse());            
                }
            }
        }
        catch(SQLException e){
            throw new ServletException(e); 
        }
        catch(ClassNotFoundException e){
            throw new ServletException(e);
        }
        catch(NumberFormatException e){
            String erro = "Número inválido!";
            getRequest().setAttribute("erro", erro);
            RequestDispatcher rd = getRequest().getRequestDispatcher("atualizarEspaco.jsp");
            rd.forward(getRequest(), getResponse());                    
        }
    }
    
}
